home *** CD-ROM | disk | FTP | other *** search
- IDT 'FFTS64'
- *
- *
- * Cooley-Tukey Radix-4, DIF FFT Program - 64-point straight-line.
- *
- * Three radix-4 butterflies - implemented with macros.
- * Complex input data located on page 0 of data memory.
- * Results are left in data RAM.
- * Uses 13-bit coefficients from MPYK instructions.
- * No scaling is done on intermediate values in the program.
- *
- *
- * Data memory allocation.
- *
- X0 EQU 0 * X's are real data values
- Y0 EQU 1 * Y's are imaginary data values
- X1 EQU 2
- Y1 EQU 3
- X2 EQU 4
- Y2 EQU 5
- X3 EQU 6
- Y3 EQU 7
- X4 EQU 8
- Y4 EQU 9
- X5 EQU 10
- Y5 EQU 11
- X6 EQU 12
- Y6 EQU 13
- X7 EQU 14
- Y7 EQU 15
- X8 EQU 16
- Y8 EQU 17
- X9 EQU 18
- Y9 EQU 19
- X10 EQU 20
- Y10 EQU 21
- X11 EQU 22
- Y11 EQU 23
- X12 EQU 24
- Y12 EQU 25
- X13 EQU 26
- Y13 EQU 27
- X14 EQU 28
- Y14 EQU 29
- X15 EQU 30
- Y15 EQU 31
- X16 EQU 32
- Y16 EQU 33
- X17 EQU 34
- Y17 EQU 35
- X18 EQU 36
- Y18 EQU 37
- X19 EQU 38
- Y19 EQU 39
- X20 EQU 40
- Y20 EQU 41
- X21 EQU 42
- Y21 EQU 43
- X22 EQU 44
- Y22 EQU 45
- X23 EQU 46
- Y23 EQU 47
- X24 EQU 48
- Y24 EQU 49
- X25 EQU 50
- Y25 EQU 51
- X26 EQU 52
- Y26 EQU 53
- X27 EQU 54
- Y27 EQU 55
- X28 EQU 56
- Y28 EQU 57
- X29 EQU 58
- Y29 EQU 59
- X30 EQU 60
- Y30 EQU 61
- X31 EQU 62
- Y31 EQU 63
- X32 EQU 64
- Y32 EQU 65
- X33 EQU 66
- Y33 EQU 67
- X34 EQU 68
- Y34 EQU 69
- X35 EQU 70
- Y35 EQU 71
- X36 EQU 72
- Y36 EQU 73
- X37 EQU 74
- Y37 EQU 75
- X38 EQU 76
- Y38 EQU 77
- X39 EQU 78
- Y39 EQU 79
- X40 EQU 80
- Y40 EQU 81
- X41 EQU 82
- Y41 EQU 83
- X42 EQU 84
- Y42 EQU 85
- X43 EQU 86
- Y43 EQU 87
- X44 EQU 88
- Y44 EQU 89
- X45 EQU 90
- Y45 EQU 91
- X46 EQU 92
- Y46 EQU 93
- X47 EQU 94
- Y47 EQU 95
- X48 EQU 96
- Y48 EQU 97
- X49 EQU 98
- Y49 EQU 99
- X50 EQU 100
- Y50 EQU 101
- X51 EQU 102
- Y51 EQU 103
- X52 EQU 104
- Y52 EQU 105
- X53 EQU 106
- Y53 EQU 107
- X54 EQU 108
- Y54 EQU 109
- X55 EQU 110
- Y55 EQU 111
- X56 EQU 112
- Y56 EQU 113
- X57 EQU 114
- Y57 EQU 115
- X58 EQU 116
- Y58 EQU 117
- X59 EQU 118
- Y59 EQU 119
- X60 EQU 120
- Y60 EQU 121
- X61 EQU 122
- Y61 EQU 123
- X62 EQU 124
- Y62 EQU 125
- X63 EQU 126
- Y63 EQU 127
- T1 EQU 128 * Temporary locations addressed
- T2 EQU 129 * by auxiliary registers.
- *************************************************************************
- *
- * Cosine and sine values (13-bit) for coefficients.
- *
- CO0 EQU 4095
- CO1 EQU 4076
- CO2 EQU 4017
- CO3 EQU 3919
- CO4 EQU 3784
- CO5 EQU 3612
- CO6 EQU 3405
- CO7 EQU 3166
- CO8 EQU 2896
- CO9 EQU 2598
- CO10 EQU 2275
- CO11 EQU 1930
- CO12 EQU 1567
- CO13 EQU 1188
- CO14 EQU 799
- CO15 EQU 401
- CO16 EQU 0
- CO17 EQU -401
- CO18 EQU -799
- CO19 EQU -1188
- CO20 EQU -1567
- CO21 EQU -1930
- CO22 EQU -2275
- CO23 EQU -2598
- CO24 EQU -2896
- CO25 EQU -3166
- CO26 EQU -3405
- CO27 EQU -3612
- CO28 EQU -3784
- CO29 EQU -3919
- CO30 EQU -4017
- CO31 EQU -4076
- CO32 EQU -4095
- CO33 EQU -4076
- CO34 EQU -4017
- CO35 EQU -3919
- CO36 EQU -3784
- CO37 EQU -3612
- CO38 EQU -3405
- CO39 EQU -3166
- CO40 EQU -2896
- CO41 EQU -2598
- CO42 EQU -2275
- CO43 EQU -1930
- CO44 EQU -1567
- CO45 EQU -1188
- CO46 EQU -799
- CO47 EQU -401
- CO48 EQU 0
- CO49 EQU 401
- CO50 EQU 799
- CO51 EQU 1188
- CO52 EQU 1567
- CO53 EQU 1930
- CO54 EQU 2275
- CO55 EQU 2598
- CO56 EQU 2896
- CO57 EQU 3166
- CO58 EQU 3405
- CO59 EQU 3612
- CO60 EQU 3784
- CO61 EQU 3919
- CO62 EQU 4017
- CO63 EQU 4076
- *
- SI0 EQU 0
- SI1 EQU 401
- SI2 EQU 799
- SI3 EQU 1188
- SI4 EQU 1567
- SI5 EQU 1930
- SI6 EQU 2275
- SI7 EQU 2598
- SI8 EQU 2896
- SI9 EQU 3166
- SI10 EQU 3405
- SI11 EQU 3612
- SI12 EQU 3784
- SI13 EQU 3919
- SI14 EQU 4017
- SI15 EQU 4076
- SI16 EQU 4095
- SI17 EQU 4076
- SI18 EQU 4017
- SI19 EQU 3919
- SI20 EQU 3784
- SI21 EQU 3612
- SI22 EQU 3405
- SI23 EQU 3166
- SI24 EQU 2896
- SI25 EQU 2598
- SI26 EQU 2275
- SI27 EQU 1930
- SI28 EQU 1567
- SI29 EQU 1188
- SI30 EQU 799
- SI31 EQU 401
- SI32 EQU 0
- SI33 EQU -401
- SI34 EQU -799
- SI35 EQU -1188
- SI36 EQU -1567
- SI37 EQU -1930
- SI38 EQU -2275
- SI39 EQU -2598
- SI40 EQU -2896
- SI41 EQU -3166
- SI42 EQU -3405
- SI43 EQU -3612
- SI44 EQU -3784
- SI45 EQU -3919
- SI46 EQU -4017
- SI47 EQU -4076
- SI48 EQU -4095
- SI49 EQU -4076
- SI50 EQU -4017
- SI51 EQU -3919
- SI52 EQU -3784
- SI53 EQU -3612
- SI54 EQU -3405
- SI55 EQU -3166
- SI56 EQU -2896
- SI57 EQU -2598
- SI58 EQU -2275
- SI59 EQU -1930
- SI60 EQU -1567
- SI61 EQU -1188
- SI62 EQU -799
- SI63 EQU -401
- ***********************************************************************
- *
- * MACROS TO PRODUCE STRAIGHT-LINE 64-POINT COMPLEX FFT.
- *
- ***********************************************************************
- *
- * ZERO for case theta = 0.
- *
- * X's and Y's are input and output locations for butterfly.
- *
- ZERO $MACRO XI,XI1,XI2,XI3,YI,YI1,YI2,YI3
- *
- LAC :XI1:
- ADD :XI3:
- SACL :XI1: * XI1 = XI1 + XI3
- SUB :XI3:,1
- SACL :XI3: * XI3 = XI1 - XI3
- LAC :XI:
- SUB :XI2:
- SACL *,0,AR1 * T1 = XI - XI2
- ADD :XI2:,1 * R1 (ACC) = XI + XI2
- ADD :XI1:
- SACL :XI: * XI = R1 + XI1
- SUB :XI1:,1
- SACL :XI2: * XI2 = R1 - XI1
- *
- LAC :YI1:
- ADD :YI3:
- SACL :YI1: * YI1 = YI1 + YI3
- SUB :YI3:,1
- SACL :YI3: * YI3 = YI1 - YI3
- LAC :YI:
- SUB :YI2:
- SACL *,0,AR0 * T2 = YI - YI2
- ADD :YI2:,1 * R1 (ACC) = YI + YI2
- ADD :YI1:
- SACL :YI: * YI = R1 + YI1
- SUB :YI1:,1
- SACL :YI2: * YI2 = R1 - YI1
- *
- LAC *
- ADD :YI3:
- SACL :XI1: * XI1 = T1 + YI3
- SUB :YI3:,1
- SACL *,0,AR1 * T1 = T1 - YI3
- LAC *,0,AR0
- ADD :XI3:
- SACL :YI3: * YI3 = T2 + XI3
- SUB :XI3:,1
- SACL :YI1: * YI1 = T2 - XI3
- LAC *
- SACL :XI3: * XI3 = T1
- *
- $END
- ***************************************************************************
- *
- * NORM - standard radix-4 butterfly.
- *
- * X's and Y's are locations of data input and output.
- * IA's specify twiddle factor locations.
- *
- NORM $MACRO XI,XI1,XI2,XI3,YI,YI1,YI2,YI3,IA1,IA2,IA3
- *
- LAC :XI1:
- ADD :XI3:
- SACL :XI1: * XI1 = XI1 + XI3
- SUB :XI3:,1
- SACL :XI3: * XI3 = XI1 - XI3
- LAC :XI:
- SUB :XI2:
- SACL *,0,AR1 * T1 = XI - XI2
- ADD :XI2:,1 * R1 (ACC) = XI + XI2
- ADD :XI1:
- SACL :XI: * XI = R1 + XI1
- SUB :XI1:,1
- SACL :XI2: * XI2 = R1 - XI1
- *
- LAC :YI1:
- ADD :YI3:
- SACL :YI1: * YI1 = YI1 + YI3
- SUB :YI3:,1
- SACL :YI3: * YI3 = YI1 - YI3
- LAC :YI:
- SUB :YI2:
- SACL *,0,AR0 * T2 = YI - YI2
- ADD :YI2:,1 * R1 (ACC) = YI + YI2
- ADD :YI1:
- SACL :YI: * YI = R1 + YI1
- SUB :YI1:,1
- SACL :YI2: * YI2 = R1 - YI1
- *
- LAC *
- ADD :YI3:
- SACL :XI1: * XI1 = T1 + YI3
- SUB :YI3:,1
- SACL *,0,AR1 * T1 = T1 - YI3
- LAC *
- ADD :XI3:
- SACL * * T2 = T2 + XI3
- SUB :XI3:,1
- SACL :YI1: * YI1 = T2 - XI3
- *
- LT :YI1:
- MPYK CO:IA1:
- PAC
- LT :XI1:
- MPYK SI:IA1:
- SPAC
- LT :YI1:
- SACH :YI1:,4 * YI1 = YI1*CO1 - XI1*SI1
- MPYK SI:IA1:
- PAC
- LT :XI1:
- MPYK CO:IA1:
- LTA :YI2:
- SACH :XI1:,4 * XI1 = YI1*SI1 + XI1*CO1
- *
- MPYK CO:IA2:
- PAC
- LT :XI2:
- MPYK SI:IA2:
- SPAC
- LT :YI2:
- SACH :YI2:,4 * YI2 = YI2*CO2 - XI2*SI2
- MPYK SI:IA2:
- PAC
- LT :XI2:
- MPYK CO:IA2:
- LTA *,AR0
- SACH :XI2:,4 * XI2 = YI2*SI2 + XI2*CO2
- *
- MPYK CO:IA3:
- PAC
- LT *,AR1
- MPYK SI:IA3:
- SPAC
- SACH :YI3:,4 * YI3 = T2*CO3 - T1*SI3
- MPYK CO:IA3:
- PAC
- LT *,AR0
- MPYK SI:IA3:
- APAC
- SACH :XI3:,4 * XI3 = T1*CO3 + T2*SI3
- *
- $END
- ***************************************************************************
- *
- * SPEC for case theta = pi/4
- *
- * X's and Y's are data input and output locations.
- *
- SPEC $MACRO XI,XI1,XI2,XI3,YI,YI1,YI2,YI3
- *
- LAC :XI:
- ADD :XI2:
- SACL :XI: * XI = XI + XI2
- SUB :XI2:,1
- SACL :XI2: * XI2 = XI - XI2
- *
- LAC :YI:
- ADD :YI2:
- SACL :YI: * YI = YI + YI2
- SUB :YI2:,1
- SACL :YI2: * YI2 = YI - YI2
- *
- LAC :XI1:
- ADD :XI3:
- SACL :XI1: * XI1 = XI1 + XI3
- SUB :XI3:,1
- SACL :XI3: * XI3 = XI1 - XI3
- *
- LAC :YI1:
- ADD :YI3:
- SACL :YI1: * YI1 = YI1 + YI3
- SUB :YI3:,1
- SACL :YI3: * YI3 = YI1 - YI3
- *
- LAC :XI1:
- SUB :XI:
- SACL *,0,AR1 * T1 = XI1 - XI
- ADD :XI:,1
- SACL :XI: * XI = XI1 + XI
- LAC :YI:
- ADD :YI1:
- SACL :YI: * YI = YI + YI1
- SUB :YI1:,1
- SACL * * T2 = YI - YI1
- *
- LAC :XI2:
- ADD :YI3:
- SACL :XI1: * XI1 = XI2 + YI3
- SUB :YI3:,1
- SACL :YI3: * YI3 = XI2 - YI3
- LAC *,0,AR0
- SACL :XI2: * XI2 = T2
- LAC :YI2:
- SUB :XI3:
- SACL :YI1: * YI1 = YI2 - XI3
- ADD :XI3:,1
- SACL :XI3: * XI3 = YI2 + XI3
- LAC *
- SACL :YI2: * YI2 = T1
- *
- LT :YI1:
- MPYK CO8
- PAC
- LT :XI1:
- MPYK CO8
- SPAC
- SACH :YI1:,4 * YI1 = (YI1-XI1)*CO8
- APAC
- LTA :YI3:
- SACH :XI1:,4 * XI1 = (YI1+XI1)*CO8
- ZAC
- MPYK CO8
- SPAC
- LT :XI3:
- MPYK CO8
- SPAC
- SACH :YI3:,4 * YI3 = -(YI3+XI3)*CO8
- APAC
- APAC
- SACH :XI3:,4 * XI3 = (XI3 - YI3)*CO8
- *
- $END
- *************************************************************************
- *
- * MAIN routine to call above macros with appropriate parameters.
- *
- *************************************************************************
- AORG 0
- *
- FFT64 LDPK 0 * Use input data is on page 0.
- LARP 0
- LARK AR0,T1 * AR0 points to Temp 1.
- LARK AR1,T2 * AR1 points to Temp 2.
- *
- * PASS 1
- *
- ZERO X0,X16,X32,X48,Y0,Y16,Y32,Y48
- *
- NORM X1,X17,X33,X49,Y1,Y17,Y33,Y49,1,2,3
- NORM X2,X18,X34,X50,Y2,Y18,Y34,Y50,2,4,6
- NORM X3,X19,X35,X51,Y3,Y19,Y35,Y51,3,6,9
- NORM X4,X20,X36,X52,Y4,Y20,Y36,Y52,4,8,12
- NORM X5,X21,X37,X53,Y5,Y21,Y37,Y53,5,10,15
- NORM X6,X22,X38,X54,Y6,Y22,Y38,Y54,6,12,18
- NORM X7,X23,X39,X55,Y7,Y23,Y39,Y55,7,14,21
- *
- SPEC X8,X24,X40,X56,Y8,Y24,Y40,Y56
- *
- NORM X9,X25,X41,X57,Y9,Y25,Y41,Y57,9,18,27
- NORM X10,X26,X42,X58,Y10,Y26,Y42,Y58,10,20,30
- NORM X11,X27,X43,X59,Y11,Y27,Y43,Y59,11,22,33
- NORM X12,X28,X44,X60,Y12,Y28,Y44,Y60,12,24,36
- NORM X13,X29,X45,X61,Y13,Y29,Y45,Y61,13,26,39
- NORM X14,X30,X46,X62,Y14,Y30,Y46,Y62,14,28,42
- NORM X15,X31,X47,X63,Y15,Y31,Y47,Y63,15,30,45
- *
- * PASS 2
- *
- ZERO X0,X4,X8,X12,Y0,Y4,Y8,Y12
- ZERO X16,X20,X24,X28,Y16,Y20,Y24,Y28
- ZERO X32,X36,X40,X44,Y32,Y36,Y40,Y44
- ZERO X48,X52,X56,X60,Y48,Y52,Y56,Y60
- *
- NORM X1,X5,X9,X13,Y1,Y5,Y9,Y13,4,8,12
- NORM X17,X21,X25,X29,Y17,Y21,Y25,Y29,4,8,12
- NORM X33,X37,X41,X45,Y33,Y37,Y41,Y45,4,8,12
- NORM X49,X53,X57,X61,Y49,Y53,Y57,Y61,4,8,12
- *
- SPEC X2,X6,X10,X14,Y2,Y6,Y10,Y14
- SPEC X18,X22,X26,X30,Y18,Y22,Y26,Y30
- SPEC X34,X38,X42,X46,Y34,Y38,Y42,Y46
- SPEC X50,X54,X58,X62,Y50,Y54,Y58,Y62
- *
- NORM X3,X7,X11,X15,Y3,Y7,Y11,Y15,12,24,36
- NORM X19,X23,X27,X31,Y19,Y23,Y27,Y31,12,24,36
- NORM X35,X39,X43,X47,Y35,Y39,Y43,Y47,12,24,36
- NORM X51,X55,X59,X63,Y51,Y55,Y59,Y63,12,24,36
- *
- * PASS 3
- *
- ZERO X0,X1,X2,X3,Y0,Y1,Y2,Y3
- ZERO X4,X5,X6,X7,Y4,Y5,Y6,Y7
- ZERO X8,X9,X10,X11,Y8,Y9,Y10,Y11
- ZERO X12,X13,X14,X15,Y12,Y13,Y14,Y15
- ZERO X16,X17,X18,X19,Y16,Y17,Y18,Y19
- ZERO X20,X21,X22,X23,Y20,Y21,Y22,Y23
- ZERO X24,X25,X26,X27,Y24,Y25,Y26,Y27
- ZERO X28,X29,X30,X31,Y28,Y29,Y30,Y31
- ZERO X32,X33,X34,X35,Y32,Y33,Y34,Y35
- ZERO X36,X37,X38,X39,Y36,Y37,Y38,Y39
- ZERO X40,X41,X42,X43,Y40,Y41,Y42,Y43
- ZERO X44,X45,X46,X47,Y44,Y45,Y46,Y47
- ZERO X48,X49,X50,X51,Y48,Y49,Y50,Y51
- ZERO X52,X53,X54,X55,Y52,Y53,Y54,Y55
- ZERO X56,X57,X58,X59,Y56,Y57,Y58,Y59
- ZERO X60,X61,X62,X63,Y60,Y61,Y62,Y63
- *
- END